<?php

namespace morphos\test\Russian;

use morphos\NumeralGenerator;
use morphos\Russian\Cases;
use morphos\Russian\OrdinalNumeralGenerator;
use PHPUnit\Framework\TestCase;

class OrdinalNumeralTest extends TestCase
{
    /**
     * @dataProvider numbersProvider
     */
    public function testGetCases($number, $gender, $case, $case2, $case3, $case4, $case5, $case6)
    {
        $this->assertEquals([
            Cases::IMENIT => $case,
            Cases::RODIT => $case2,
            Cases::DAT => $case3,
            Cases::VINIT => $case4,
            Cases::TVORIT => $case5,
            Cases::PREDLOJ => $case6,
        ], OrdinalNumeralGenerator::getCases($number, $gender));
    }

    public function numbersProvider()
    {
        return [
            [1, NumeralGenerator::MALE, 'первый', 'первого', 'первому', 'первый', 'первым', 'первом'],
            [1, NumeralGenerator::FEMALE, 'первая', 'первой', 'первой', 'первую', 'первой', 'первой'],
            [3, NumeralGenerator::MALE, 'третий', 'третьего', 'третьему', 'третьего', 'третьим', 'третьем'],
            [
                13,
                NumeralGenerator::MALE,
                'тринадцатый',
                'тринадцатого',
                'тринадцатому',
                'тринадцатый',
                'тринадцатым',
                'тринадцатом',
            ],
            [
                20,
                NumeralGenerator::NEUTER,
                'двадцатое',
                'двадцатого',
                'двадцатому',
                'двадцатое',
                'двадцатым',
                'двадцатом',
            ],
            [
                40,
                NumeralGenerator::NEUTER,
                'сороковое',
                'сорокового',
                'сороковому',
                'сороковое',
                'сороковым',
                'сороковом',
            ],
            [
                113,
                NumeralGenerator::MALE,
                'сто тринадцатый',
                'сто тринадцатого',
                'сто тринадцатому',
                'сто тринадцатый',
                'сто тринадцатым',
                'сто тринадцатом',
            ],
            [
                201,
                NumeralGenerator::MALE,
                'двести первый',
                'двести первого',
                'двести первому',
                'двести первый',
                'двести первым',
                'двести первом',
            ],
            [
                344,
                NumeralGenerator::MALE,
                'триста сорок четвертый',
                'триста сорок четвертого',
                'триста сорок четвертому',
                'триста сорок четвертый',
                'триста сорок четвертым',
                'триста сорок четвертом',
            ],
            [
                1007,
                NumeralGenerator::MALE,
                'тысяча седьмой',
                'тысяча седьмого',
                'тысяча седьмому',
                'тысяча седьмой',
                'тысяча седьмым',
                'тысяча седьмом',
            ],
            [
                1013,
                NumeralGenerator::MALE,
                'тысяча тринадцатый',
                'тысяча тринадцатого',
                'тысяча тринадцатому',
                'тысяча тринадцатый',
                'тысяча тринадцатым',
                'тысяча тринадцатом',
            ],
            [
                3651,
                NumeralGenerator::MALE,
                'три тысячи шестьсот пятьдесят первый',
                'три тысячи шестьсот пятьдесят первого',
                'три тысячи шестьсот пятьдесят первому',
                'три тысячи шестьсот пятьдесят первый',
                'три тысячи шестьсот пятьдесят первым',
                'три тысячи шестьсот пятьдесят первом',
            ],
            [
                9999,
                NumeralGenerator::MALE,
                'девять тысяч девятьсот девяносто девятый',
                'девять тысяч девятьсот девяносто девятого',
                'девять тысяч девятьсот девяносто девятому',
                'девять тысяч девятьсот девяносто девятый',
                'девять тысяч девятьсот девяносто девятым',
                'девять тысяч девятьсот девяносто девятом',
            ],
            [
                27013,
                NumeralGenerator::MALE,
                'двадцать семь тысяч тринадцатый',
                'двадцать семь тысяч тринадцатого',
                'двадцать семь тысяч тринадцатому',
                'двадцать семь тысяч тринадцатый',
                'двадцать семь тысяч тринадцатым',
                'двадцать семь тысяч тринадцатом',
            ],
            [
                1234567890,
                NumeralGenerator::MALE,
                'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностый',
                'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностого',
                'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностому',
                'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностый',
                'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностым',
                'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностом',
            ],
            [1000, NumeralGenerator::MALE, 'тысячный', 'тысячного', 'тысячному', 'тысячный', 'тысячным', 'тысячном'],
            [
                1000000000,
                NumeralGenerator::MALE,
                'миллиардный',
                'миллиардного',
                'миллиардному',
                'миллиардный',
                'миллиардным',
                'миллиардном',
            ],
            [
                1000000090,
                NumeralGenerator::MALE,
                'миллиард девяностый',
                'миллиард девяностого',
                'миллиард девяностому',
                'миллиард девяностый',
                'миллиард девяностым',
                'миллиард девяностом',
            ],
        ];
    }

    /**
     * @dataProvider numbersProvider()
     * @throws \Exception
     */
    public function testGetCase($number, $gender, $case, $case2)
    {
        $this->assertEquals($case2, OrdinalNumeralGenerator::getCase($number, Cases::RODIT, $gender));
    }
}
